package receiver;

import java.util.Observable;

public class MiniEditeurImpl extends Observable implements MiniEditeur {

	private Buffer _buffer;

	private PressePapier _pressePapier;

	private Selection _selection;
	
	public MiniEditeurImpl(Buffer buffer, PressePapier pressePapier,
			Selection selection) {

		this._buffer = buffer;
		this._pressePapier = pressePapier;
		this._selection = selection;
	}

	public MiniEditeurImpl() {
		this._buffer = new Buffer("");
		this._pressePapier = new PressePapier();
		this._selection = new Selection();

	}

	public Buffer getBuffer() {
		return _buffer;
	}

	public void setBuffer(Buffer buffer) {
		this._buffer = buffer;
	}

	public PressePapier getPressePapier() {
		return _pressePapier;
	}

	public void setPressePapier(PressePapier pressePapier) {
		this._pressePapier = pressePapier;
	}

	public Selection getSelection() {
		return _selection;
	}

	public void setSelection(Selection selection) {
		this._selection = selection;
	}

	

	/**
	 * copie la selection � partir du buffer vers  le presse-papier
	 */
	public void copier( )
	{		
		int debut = _selection.getDebut();
		int fin = _selection.getFin();
		if(debut == fin) {		
			String texte = _buffer.getContenu(debut, fin);
			_pressePapier.setContenu(texte);
			System.out.println("copier");
		}
	}

	/**
	 * coller la selection du presse-papier vers le buffer 
	 */
	public void coller( )
	{
		int debut = _selection.getDebut();
		int fin = _selection.getFin();

		String texte = _pressePapier.getContenu();

		if(!texte.isEmpty()){
			_buffer.inserer(debut, fin, texte);
			this.setChanged();
			this.notifyObservers(getChanged());

			System.out.println("coller");
		}
	}

	/**
	 * copie la selection � partir du buffer, l'efface et la met dans  le presse-papier
	 */
	public void couper( )
	{
		int debut = _selection.getDebut();
		int fin = _selection.getFin();

		if(debut != fin) {			
			String texte = _buffer.getContenu(debut, fin);
			_pressePapier.setContenu(texte);
			_buffer.effacer(debut, fin);

			this.setChanged();
			this.notifyObservers(getChanged());

			System.out.println("Couper");
		}
	}

	/**
	 * selectionne un d�but et une fin dans le buffer 
	 * @param  debut de type int sp�cifie le d�but de la selection 
	 * @param fin de type int sp�cifie la fin  de la selection
	 */
	public void selectionner( int debut, int fin )
	{
		_selection.setDebut(debut);
		_selection.setFin(fin);
	}

	/**
	 * Ins�re � partir du clavier du texte dans le buffer
	 * Si début = Fin alors la chaine de caractères est vide
	 * @param texte de type String
	 * @exception StringIndexOutOfBoundsException
	 */
	public void saisirTexte( String texte ) 
	{
		//
		int debut = _selection.getDebut();
		int fin = _selection.getFin();

		if(debut > fin) throw new StringIndexOutOfBoundsException("le début de la selection est supérieur à sa fin");		 

		_buffer.inserer(debut, fin, texte);
		System.out.println("Inserer");
		this.setChanged();
		this.notifyObservers(getChanged());
	}

	private String getChanged() {
		return new String(_buffer.getBuffer());
	}	

}
